package com.billdowney.qq.robot.plugins;

import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 机器人插件管理，必须通过spring扫描注入
 *
 * @author BillDowney
 * @date 2021/4/5 12:33
 */
@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class RobotPluginManage {

    /**
     * 暂存所有插件，防止重复从spring中获取
     */
    private static final Map<String, Integer> PLUGINS_ALL = new LinkedHashMap<>();
    /**
     * 暂存所有插件，防止重复从spring中获取
     */
    private static final List<RobotPlugin> PLUGINS_ALL_LIST = new ArrayList<>();
    /**
     * 启动标记
     */
    private final Map<String, Boolean> PLUGINS_FLAG = new HashMap<>();

    public RobotPluginManage(List<RobotPlugin> plugins) {
        super();
        boolean flag = PLUGINS_ALL_LIST.isEmpty();
        plugins.forEach(item -> {
            if (flag) {
                PLUGINS_ALL_LIST.add(item);
            }
            PLUGINS_FLAG.put(item.info().getName(), item.info().isStart());
        });
        if (flag) {
            // 先排序
            PLUGINS_ALL_LIST.sort((item1, item2) -> {
                int order1 = item1.info().getOrder();
                int order2 = item2.info().getOrder();
                if (order1 == order2) {
                    return 0;
                }
                return order1 > order2 ? 1 : -1;
            });
            for (int i = 0; i < PLUGINS_ALL_LIST.size(); i++) {
                PLUGINS_ALL.put(PLUGINS_ALL_LIST.get(i).info().getName(), i);
            }
        }
    }

    /**
     * 获取启动的插件列表
     *
     * @return 插件列表
     */
    public List<RobotPlugin> getStart() {
        return PLUGINS_ALL_LIST.stream().filter(item -> PLUGINS_FLAG.get(item.info().getName())).collect(Collectors.toList());
    }

    /**
     * 获取所有的插件，包含启动标记
     *
     * @return 插件列表
     */
    public Map<RobotPlugin, Boolean> getAllFlag() {
        return PLUGINS_ALL_LIST.stream().collect(Collectors.toMap(item -> item, item -> PLUGINS_FLAG.get(item.info().getName())));
    }

    /**
     * 查询插件是否启动
     *
     * @param name 插件名称{@link RobotPlugin#info()}
     */
    public boolean isStart(String name) {
        return PLUGINS_FLAG.get(name);
    }

    /**
     * 根据插件名称启动插件
     *
     * @param name  插件名称{@link RobotPlugin#info()}
     * @param start 是否启用
     */
    public void start(String name, boolean start) {
        if (PLUGINS_FLAG.containsKey(name)) {
            PLUGINS_FLAG.put(name, start);
        }
    }

    /**
     * 根据插件名称获取插件信息
     *
     * @param name 插件名称{@link RobotPlugin#info()}
     */
    public RobotPlugin get(String name) {
        if (PLUGINS_ALL.containsKey(name)) {
            return PLUGINS_ALL_LIST.get(PLUGINS_ALL.get(name));
        }
        return null;
    }
}
